package kotlincore.chapt02.高阶函数和Lambda.Lambda是语法糖

class test {
}

fun main() {
    //用Lambda的形式定义一个加法操作
    val sum:(Int,Int) -> Int={x:Int,y:Int -> x + y}

    //由于支持类型推导，我们可以采用两种方式进行简化
    val sum1 = { x:Int,y:Int -> x + y }
    //或者
    val sum2:(Int,Int) -> Int ={x,y -> x+y}


    /*
    * 总结Lambda的语法
    * 一个Lambda表达式必通过{}来包裹；
    * 如果Lambda声明了参数部分的类型，且返回值类型支持类型推导，那么Lambda变量就可以省略函数类型声明；
    * 如果Lambda变量声明了函数类型，那么Lambda的参数部分的类型就可以省略。
    * */
    //此外，如果Lambda表达式返回的不是Unit，那么默认最后一行表达式的值类型就返回值类型
    val foo = {x:Int ->
        val y = x + 1
        y //返回值是y
    }
    println(foo(1))
    println(foo.invoke(1))

    //用fun关键字声明Lambda表达式
    fun foo(int:Int)={
        print(int)
    }
    listOf(1,2,3).forEach { foo(it)}

    //单个参数的隐匿名称,代表了这个Lambda接收的单个参数。这里的调用等价于
    listOf(1,2,3).forEach { item -> foo(item) }
    //默认情况下，我们要以直接用it来代表item，而不需要用item->进行声明。

    listOf(1,2,3).forEach { foo(it).invoke()}
    listOf(1,2,3).forEach { foo(it)()}
}